/**
 * Implementierung der Klasse SimpleGameSprite
 *
 * @author  Ken Dahm, Benjamin Friedrich
 * @version 1.0  18.01.2009
 */
#include "SimpleGameSprite.hpp"


SimpleGameSprite::SimpleGameSprite(int x, int y, int width, int height, int stepWidth, bool isAlive)
{
	// Sprite muss sichtbar sein
	if(width <= 0 || height <= 0)
	{
		throw SimpleGameSprite::GameException("Ungültige Höhe oder Breite für Sprite angegeben!");
	}

	/* Sprite muss sich bewegen können. Negative Werte würde hier bewirken, dass sich
	   das Sprite in umgekehrten Richtung bewegen würde. */
	if(stepWidth <= 0)
	{
		throw SimpleGameSprite::GameException("Schrittweite muss > 0  sein!");
	}

	//-- Lower Left
	this->sourceX   = x;
	this->sourceY   = y;

	//-- Upper Right
	this->width     = width;
	this->height    = height;

	this->isAlive   = isAlive;
	this->stepWidth = stepWidth;

	// Berechnung des "Rechtecks" über dem Sprite
	this->updateDimension();
}


void SimpleGameSprite::updateDimension()
{
		this->destinationX = this->sourceX + this->width;
		this->destinationY = this->sourceY + this->width;
}


void SimpleGameSprite::moveLeft()
{
	if(! this->isAlive)
	{
		throw SimpleGameSprite::GameException("Tot kann man sich nicht bewegen...!");
	}

	this->sourceX -= this->stepWidth;
	this->updateDimension();
}


void SimpleGameSprite::moveRight()
{
	if(! this->isAlive)
	{
		throw SimpleGameSprite::GameException("Tot kann man sich nicht bewegen...!");
	}

	this->sourceX += this->stepWidth;
	this->updateDimension();
}


void SimpleGameSprite::moveUp()
{
	if(! this->isAlive)
	{
		throw SimpleGameSprite::GameException("Tot kann man sich nicht bewegen...!");
	}

	this->sourceY += this->stepWidth;
	this->updateDimension();
}


void SimpleGameSprite::moveDown()
{
	if(! this->isAlive)
	{
		throw SimpleGameSprite::GameException("Tot kann man sich nicht bewegen...!");
	}

	this->sourceY -= this->stepWidth;
	this->updateDimension();
}



bool SimpleGameSprite::hit(const SimpleGameSprite& otherEntity) const
{
	// Prüfung, ob Kollision von der Höhe her möglich wäre
	bool checkHitSrcY  = (this->sourceY >= otherEntity.sourceY     ) &&
	                     (this->sourceY <= otherEntity.destinationY);

	bool checkHitDestY = (this->destinationY >= otherEntity.sourceY     ) &&
	                     (this->destinationY <= otherEntity.destinationY);

	// Prüfung, ob Kollision von den X-Koordinaten möglich wäre
	bool checkHitSrcX  = (this->sourceX      >= otherEntity.sourceX     ) &&
						 (this->sourceX      <= otherEntity.destinationX);

	bool checkHitDestX = (this->destinationX >= otherEntity.sourceX     ) &&
						 (this->destinationX <= otherEntity.destinationX);

	// Auswertung der Prüfergebnisse auf Kollision
	return (checkHitSrcY || checkHitDestY) && (checkHitSrcX || checkHitDestX);
}
